package com.example.base_model.network.result

import com.example.base_model.network.request_param.RequestParamInterface
import com.example.base_model.network.result.BaseResult.Companion.error

/**
 * @Author jiangKunKun
 * @CreateDate 2025/7/3
 * @Description 二次封装返回数据类型并且带状态和请求参数
 * @SpittingGrooves
 */
class BaseResult<T> internal constructor(
    /**
     * 请求的状态，用于表示当前请求的生命周期阶段。
     */
    val status: RequestStatus,
    /**
     * 请求成功时返回的数据，可以为null。
     */
    val data: T? = null,
    /**
     * 请求返回的消息，通常用于表示成功或失败的原因，可以为null。
     */
    val msg: String? = null,
    /**
     * 请求返回的状态码，用于标识特定的业务逻辑或错误类型，可以为null。
     */
    val code: Int? = null,
    /**
     * 请求过程中捕获到的异常信息，可以为null。
     */
    val error: Exception? = null,
    /**
     * 原始的请求参数，用于在结果中跟踪请求的上下文，可以为null。
     */
    val requestParam: RequestParamInterface? = null
){

    companion object {
        /**
         * 创建一个表示请求处于空闲状态的BaseResult实例。
         * @return 处于空闲状态的BaseResult实例。
         */
        fun <T> IDLE(): BaseResult<T> =
            BaseResult(RequestStatus.IDLE)

        /**
         * 创建一个表示请求开始的BaseResult实例。
         * @return 请求开始状态的BaseResult实例。
         */
        fun <T> start(): BaseResult<T> =
            BaseResult(RequestStatus.START)

        /**
         * 创建一个表示请求成功并带有数据的BaseResult实例。
         * @param data 成功返回的数据。
         * @param param 原始的请求参数，默认为null。
         * @return 成功状态的BaseResult实例。
         */
        fun <T> dataSuccess(data: T?, param: RequestParamInterface? = null): BaseResult<T> =
            BaseResult(RequestStatus.DATA_SUCCESS, data = data, requestParam = param)

        /**
         * 创建一个表示请求失败并带有错误码和消息的BaseResult实例。
         * @param code 失败状态码。
         * @param msg 失败消息。
         * @param data 失败时可能返回的数据，可以为null。
         * @param param 原始的请求参数，默认为null。
         * @return 失败状态的BaseResult实例。
         */
        fun <T> dataFail(code: Int, msg: String, data: T?, param: RequestParamInterface? = null): BaseResult<T> =
            BaseResult(RequestStatus.DATA_FAIL,code = code, msg = msg, data = data, requestParam = param)

        /**
         * 创建一个表示请求发生异常的BaseResult实例。
         * @param code 错误状态码。
         * @param msg 错误消息。
         * @param error 捕获到的异常。
         * @param param 原始的请求参数，默认为null。
         * @return 错误状态的BaseResult实例。
         */
        fun <T> error(code: Int, msg: String, error: Exception, param: RequestParamInterface? = null): BaseResult<T> =
            BaseResult(RequestStatus.ERROR, code = code, msg = msg, error = error, requestParam = param)

        /**
         * 创建一个表示请求结束的BaseResult实例。
         * @return 请求结束状态的BaseResult实例。
         */
        fun <T> finish(): BaseResult<T> =
            BaseResult(RequestStatus.FINISH)
    }
}